package com.hm.myapplication;

import android.content.Context;

import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;

public class BadViewPager extends ViewPager {

    private int mLastX, mLastY;

    public BadViewPager(@NonNull Context context) {
        super(context);
    }

    public BadViewPager(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    // 外部拦截法：父容器处理冲突
    // 我想要把事件分发给谁就分发给谁

    /**
     * # 代码解释
     * 1. 该方法重写了 `onInterceptTouchEvent`，用于处理触摸事件的拦截逻辑。
     * 2. 在 `ACTION_DOWN` 事件中，记录初始触碰点的坐标 `(mLastX, mLastY)`。
     * 3. 在 `ACTION_MOVE` 事件中，计算水平和垂直方向的移动距离差值，如果水平移动距离大于垂直移动距离，则返回 `true`，表示拦截事件。
     * 4. 其他事件（如 `ACTION_UP`）不做特殊处理。
     * 5. 如果不满足拦截条件，调用父类方法并返回其结果。
     * @param event
     * @return
     */

    /**
     * 重写onInterceptTouchEvent方法以实现自定义的触摸事件拦截逻辑。
     * 此方法主要用于判断是否需要拦截触摸事件，以便在ViewPager中实现特定的滑动行为。
     *
     * @param event 触摸事件对象，包含触摸事件的详细信息，如事件类型（ACTION_DOWN、ACTION_MOVE等）和触摸坐标。
     * @return 返回一个布尔值，指示是否拦截当前触摸事件。返回true表示拦截事件，后续触摸事件将由当前视图处理；
     *         返回false表示不拦截事件，触摸事件将传递给子视图处理。
     */
    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        // 获取当前触摸点的坐标
        int x = (int) event.getX();
        int y = (int) event.getY();

        // 根据触摸事件类型执行相应的逻辑
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                // 当触摸事件为按下时，记录初始触碰点的坐标
                mLastX = (int) event.getX();
                mLastY = (int) event.getY();
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                // 当触摸事件为移动时，计算水平和垂直方向的移动距离差值
                int deltaX = x - mLastX;
                int deltaY = y - mLastY;

                // 如果水平移动距离大于垂直移动距离，则认为用户意图进行水平滑动，拦截事件
                if (Math.abs(deltaX) > Math.abs(deltaY)) {
                    return true;
                }

                break;
            }
            case MotionEvent.ACTION_UP: {
                // 当触摸事件为抬起时，不执行特殊处理
                break;
            }
            default:
                // 对其他触摸事件类型不做特殊处理
                break;
        }

        // 如果不满足拦截条件，调用父类方法并返回其结果
        return super.onInterceptTouchEvent(event);

    }

}
